//package yyy.ab.common.utils.generator;
//
//import org.mybatis.generator.api.MyBatisGenerator;
//import org.mybatis.generator.config.Configuration;
//import org.mybatis.generator.config.xml.ConfigurationParser;
//import org.mybatis.generator.internal.DefaultShellCallback;
//
//import java.io.File;
//import java.text.SimpleDateFormat;
//import java.util.*;
//
///**
// * 代码生成类
// */
//public class MybatisGeneratorUtils {
//    // generatorConfig模板路径
//    private static String generatorConfig_vm = "/template/generatorConfig.vm";
//    // Service模板路径
//    private static String service_vm = "/template/Service.vm";
//    // ServiceImpl模板路径
//    private static String serviceImpl_vm = "/template/ServiceImpl.vm";
//    // QueryParam模板路径
//    private static String queryParam_vm = "/template/QueryParam.vm";
//    // Model模板路径
//    private static String model_vm = "/template/Model.vm";
//    // ServiceModel模板路径
//    private static String serviceModel_vm = "/template/ServiceModel.vm";
//    // Controller模板路径
//    private static String controller_vm = "/template/Controller.vm";
//
//    /**
//     * 获取后端代码模板名称
//     * @return List
//     */
//    private static List<String> getAdminTemplateNames() {
//        List<String> templateNames = new ArrayList<>();
//        templateNames.add("Entity");
//        templateNames.add("Mapper");
//        templateNames.add("Dto");
//        templateNames.add("QueryCriteria");
//        templateNames.add("Service");
//        templateNames.add("ServiceImpl");
//        templateNames.add("Controller");
//        templateNames.add("Sql");
//        return templateNames;
//    }
//
//    /**
//     * 获取前端代码模板名称
//     * @return List
//     */
//    private static List<String> getFrontTemplateNames() {
//        List<String> templateNames = new ArrayList<>();
//        templateNames.add("Index");
//        templateNames.add("Api");
//        return templateNames;
//    }
//
//    /**
//     * 根据模板生成generatorConfig.xml文件
//     *
//     * @param jdbc_driver   驱动路径
//     * @param jdbc_url      链接
//     * @param jdbc_username 帐号
//     * @param jdbc_password 密码
//     * @param module        项目模块
//     * @param database      数据库
//     * @param table_prefix  表前缀
//     * @param package_name  包名
//     */
//    public static void generator(
//            String jdbc_driver,
//            String jdbc_url,
//            String jdbc_username,
//            String jdbc_password,
//            String module,
//            String database,
//            String table_prefix,
//            String package_name,
//            Map<String, String> last_insert_id_tables,
//            List<String> generate_tables) throws Exception {
//
//        /* 通过JAR获取模板文件，则注释该处
//        generatorConfig_vm = MybatisGeneratorUtils.class.getResource(generatorConfig_vm).getPath().replaceFirst("/", "");
//        service_vm = MybatisGeneratorUtils.class.getResource(service_vm).getPath().replaceFirst("/", "");
//        serviceImpl_vm = MybatisGeneratorUtils.class.getResource(serviceImpl_vm).getPath().replaceFirst("/", "");
//        queryParam_vm = MybatisGeneratorUtils.class.getResource(queryParam_vm).getPath().replaceFirst("/", "");
//        model_vm = MybatisGeneratorUtils.class.getResource(model_vm).getPath().replaceFirst("/", "");
//        serviceModel_vm = MybatisGeneratorUtils.class.getResource(serviceModel_vm).getPath().replaceFirst("/", "");
//        controller_vm = MybatisGeneratorUtils.class.getResource(controller_vm).getPath().replaceFirst("/", "");
//        */
//
//        /* 目标项目(为空则为当前项目) */
//        String targetProject = "";
//        if (StringUtils.isEmpty(table_prefix)) {
//            table_prefix = "";
//        }
//        /*  */
//        package_name = package_name + ".generator";
//        String basePath = MybatisGeneratorUtils.class.getResource("/").getPath().replace("/target/classes/", "").replace(targetProject, "").replaceFirst("/", "");
//        String generatorConfig_xml = MybatisGeneratorUtils.class.getResource("/").getPath().replace("/target/classes/", "") + "/src/main/resources/generatorConfig.xml";
//        targetProject = basePath + targetProject;
//        String sql = "SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = '" + database + "' AND table_name LIKE '" + table_prefix + "_%' ";
//        if (generate_tables != null && generate_tables.size() > 0) {
//            String joinTableNames = String.join(",", generate_tables);
//            sql += " AND table_name IN (" + joinTableNames + ");";
//        }
//        System.out.println("========== 开始生成generatorConfig.xml文件 ==========");
//        List<Map<String, Object>> tables = new ArrayList<>();
//        try {
//            VelocityContext context = new VelocityContext();
//            Map<String, Object> table;
//
//            // 查询定制前缀项目的所有表
//            JdbcUtils jdbcUtil = new JdbcUtils(jdbc_driver, jdbc_url, jdbc_username, AESUtils.AESDecode(jdbc_password));
//            List<Map> result = jdbcUtil.selectByParams(sql, null);
//            for (Map map : result) {
//                System.out.println(map.get("TABLE_NAME"));
//                table = new HashMap<>();
//                table.put("table_name", map.get("TABLE_NAME"));
//                //table.put("model_name", StringUtils.lineToHump(map.get("TABLE_NAME").toString().replace(table_prefix, "")));
//                table.put("model_name", StringUtils.lineToHump(map.get("TABLE_NAME").toString().replaceFirst(table_prefix, "")));
//                tables.add(table);
//            }
//            jdbcUtil.release();
//
//            context.put("tables", tables);
//            /* entity.class */
//            context.put("generator_javaEntityGenerator_targetPackage", package_name + ".entity");
//            /* mapper.xml */
//            context.put("generator_sqlMapGenerator_targetPackage", package_name + ".mapper");
//            /* repository interface */
//            context.put("generator_javaClientGenerator_targetPackage", package_name + ".repository");
//            context.put("targetProject", targetProject);
//            context.put("targetProject_sqlMap", targetProject);
//            context.put("generator_jdbc_password", AESUtils.AESDecode(jdbc_password));
//            context.put("last_insert_id_tables", last_insert_id_tables);
//            VelocityUtils.generateByJar(generatorConfig_vm, generatorConfig_xml, context);
//            // 删除旧代码
//            deleteDir(new File(targetProject + "/src/main/java/" + package_name.replaceAll("\\.", "/") + "/entity"));
//            deleteDir(new File(targetProject + "/src/main/java/" + package_name.replaceAll("\\.", "/") + "/repository"));
//            deleteDir(new File(targetProject + "/src/main/java/" + package_name.replaceAll("\\.", "/") + "/mapper"));
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        System.out.println("========== 结束生成generatorConfig.xml文件 ==========");
//
//        System.out.println("========== 开始运行MybatisGenerator ==========");
//        List<String> warnings = new ArrayList<>();
//        File configFile = new File(generatorConfig_xml);
//        ConfigurationParser cp = new ConfigurationParser(warnings);
//        Configuration config = cp.parseConfiguration(configFile);
//        DefaultShellCallback callback = new DefaultShellCallback(true);
//        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
//        myBatisGenerator.generate(null);
//        for (String warning : warnings) {
//            System.out.println(warning);
//        }
//        System.out.println("========== 结束运行MybatisGenerator ==========");
//
//        System.out.println("========== 开始生成Service,Controller ==========");
//        String ctime = new SimpleDateFormat("yyyy/M/d").format(new Date());
//        /* service path */
//        String servicePath = basePath + "/src/main/java/" + package_name.replaceAll("\\.", "/") + "/service";
//        /* service impl path */
//        String serviceImplPath = basePath + "/src/main/java/" + package_name.replaceAll("\\.", "/") + "/service/impl";
//        /* mode path */
//        String modePath = basePath + "/src/main/java/" + package_name.replaceAll("\\.", "/") + "/model";
//        /* query param path */
//        String queryParamPath = basePath + "/src/main/java/" + package_name.replaceAll("\\.", "/") + "/model/param";
//        /* service model path */
//        String serviceModelPath = basePath + "/src/main/java/" + package_name.replaceAll("\\.", "/") + "/model/web";
//        /* controller path */
//        String controllerPath = basePath + "/src/main/java/" + package_name.replaceAll("\\.", "/") + "/controller";
//        /* 检查文件夹 */
//        File fileService = new File(servicePath);
//        if (!fileService.exists() && !fileService.isDirectory()) {
//            fileService.mkdir();
//        }
//        File fileServiceImpl = new File(serviceImplPath);
//        if (!fileServiceImpl.exists() && !fileServiceImpl.isDirectory()) {
//            fileServiceImpl.mkdir();
//        }
//        File modelParam = new File(modePath);
//        if (!modelParam.exists() && !modelParam.isDirectory()) {
//            modelParam.mkdir();
//        }
//        File fileQueryParam = new File(queryParamPath);
//        if (!fileQueryParam.exists() && !fileQueryParam.isDirectory()) {
//            fileQueryParam.mkdir();
//        }
//        File fileServiceModel = new File(serviceModelPath);
//        if (!fileServiceModel.exists() && !fileServiceModel.isDirectory()) {
//            fileServiceModel.mkdir();
//        }
//        File fileController = new File(controllerPath);
//        if (!fileController.exists() && !fileController.isDirectory()) {
//            fileController.mkdir();
//        }
//        for (int i = 0; i < tables.size(); i++) {
//            //String modelName = StringUtils.lineToHump(tables.get(i).get("table_name").toString().replace(table_prefix, ""));
//            String modelName = StringUtils.lineToHump(tables.get(i).get("table_name").toString().replaceFirst(table_prefix, ""));
//            String service = servicePath + "/" + modelName + "Service.java";
//            String serviceImpl = serviceImplPath + "/" + modelName + "ServiceImpl.java";
//            String queryParam = queryParamPath + "/" + modelName + "QueryParam.java";
//            String serviceModel = serviceModelPath + "/" + modelName + "ServiceModel.java";
//            //String model = serviceModelPath + "/" + modelName + "Model.java";
//            String controller = controllerPath + "/" + modelName + "Controller.java";
//            // 生成service
//            File serviceFile = new File(service);
//            if (!serviceFile.exists()) {
//                VelocityContext context = new VelocityContext();
//                context.put("package_name", package_name);
//                context.put("model", modelName);
//                context.put("ctime", ctime);
//                VelocityUtils.generateByJar(service_vm, service, context);
//                System.out.println(service);
//            }
//            // 生成serviceImpl
//            File serviceImplFile = new File(serviceImpl);
//            if (!serviceImplFile.exists()) {
//                VelocityContext context = new VelocityContext();
//                context.put("package_name", package_name);
//                context.put("model", modelName);
//                context.put("mapper", StringUtils.toLowerCaseFirstOne(modelName));
//                context.put("ctime", ctime);
//                VelocityUtils.generateByJar(serviceImpl_vm, serviceImpl, context);
//                System.out.println(serviceImpl);
//            }
//            // 生成queryParam
//            File queryParamFile = new File(queryParam);
//            if (!queryParamFile.exists()) {
//                VelocityContext context = new VelocityContext();
//                context.put("package_name", package_name);
//                context.put("model", modelName);
//                context.put("modelname", StringUtils.toLowerCaseFirstOne(modelName));
//                context.put("ctime", ctime);
//                VelocityUtils.generateByJar(queryParam_vm, queryParam, context);
//                System.out.println(queryParam);
//            }
//            // 生成model
////            File modelFile = new File(model);
////            if (!modelFile.exists()) {
////                VelocityContext context = new VelocityContext();
////                context.put("package_name", package_name);
////                context.put("model", modelName);
////                context.put("modelname", StringUtils.toLowerCaseFirstOne(modelName));
////                context.put("ctime", ctime);
////                VelocityUtils.generateByJar(model_vm, model, context);
////                System.out.println(serviceModel);
////            }
//            // 生成serviceModel
//            File serviceModelFile = new File(serviceModel);
//            if (!serviceModelFile.exists()) {
//                VelocityContext context = new VelocityContext();
//                context.put("package_name", package_name);
//                context.put("model", modelName);
//                context.put("modelname", StringUtils.toLowerCaseFirstOne(modelName));
//                context.put("ctime", ctime);
//                VelocityUtils.generateByJar(serviceModel_vm, serviceModel, context);
//                System.out.println(serviceModel);
//            }
//            // 生成controller
//            File controllerFile = new File(controller);
//            if (!controllerFile.exists()) {
//                VelocityContext context = new VelocityContext();
//                context.put("package_name", package_name);
//                context.put("model", modelName);
//                context.put("modelname", StringUtils.toLowerCaseFirstOne(modelName));
//                context.put("ctime", ctime);
//                VelocityUtils.generateByJar(controller_vm, controller, context);
//                System.out.println(controller);
//            }
//        }
//        System.out.println("========== 结束生成Service,Controller ==========");
//    }
//
//    // 递归删除非空文件夹
//    public static void deleteDir(File dir) {
//        if (dir.isDirectory()) {
//            File[] files = dir.listFiles();
//            for (int i = 0; i < files.length; i++) {
//                deleteDir(files[i]);
//            }
//        }
//        dir.delete();
//    }
//}
